public class LogicDemo {
    public static void main(String[] args) {
        // 三. 逻辑运算符
        // 与 或 非
        /*
        与: &&   &
        或: ||
        非: !
         */
        // 逻辑运算符是对其他的关系(比较)表达式进行运算
        // 例子: 判断一个变量n是不是1到10之间的数
        // 判断变量n是不是大于等于1 并且 小于等于10
        int n = 3;
        boolean result = n >= 1 && n <= 10;
        // 判断一个数 是不是3和5的倍数
        // 判断变量n能不能同时被3和5整除
        // n对3求余是不是等于0 并且 对5求余是不是也等于0
        boolean isDiv = n % 3 == 0 && n % 5 == 0;
        // 与: 两个条件都是true, 结果才是true.
        // 或: 两个条件中只要有一个是true, 结果就是true
        // 非: 一目运算符, 直接取反
        System.out.println(!isDiv);

        // 四. 位运算符
        // <<  >>  ^    &  |
        // 左移 右移 异或 与 或

        // &
        int x = 14, y = 26, z;
        z = x & y;
        System.out.println(z);
        System.out.println(x | y);
        /*
        0000 1110  14
        0001 1010  26
        ---------------
        0000 1010 & 10
        0001 1110 | 30
        0001 0100 ^ 20
         */
        System.out.println(x << 2);
//        0000 1110  14 代表 14 * 2²
//        0011 1000  56
        // 如何最高效率的判断一个变量是不是偶数
        // 15  0000 1111
        //  0000 0111 >>1
        //  0000 1110
        System.out.println(x == x >> 1 << 1);
        // 练习: 不使用第三个变量, 交换两个变量的值
        x = x ^ y;
        y = x ^ y;
        x = x ^ y;
        System.out.println(x);
        System.out.println(y);
        // 玲玲  玲依  依玲  依依
        // 忆初

        // &&   & 的区别
        // && 代表逻辑运算符'与'.
        // & 是位运算符'与', 也可以当做逻辑运算符
        // 都当做逻辑运算符的时候, 它俩有区别:
        // && 有短路的机制
        // 如果第一个表达式的结果已经是false,
        // 那么后面的表达式不会被计算
        // || 与 |  同理

        // 判断一个数 是不是3和5的倍数
        // 判断变量n能不能同时被3和5整除
        // n对3求余是不是等于0 并且 对5求余是不是也等于0
        n = 10;
        boolean b = n % 3 == 0 & n++ % 5 == 0;
//        boolean c = n % 3 == 0 && n++ % 5 == 0;
        System.out.println(n);
        System.out.println(n + "能不能被3和5同时整除:" + b);

        // 结论: 整数的除法中, 0不能作为除数
        // 浮点可以
        float f = -3.5F;
        System.out.println(f / 0);

        byte by = 5;
        by = (byte)(by + 5);
    }
}
